#include maps/mp/gametypes/_hud_util;
#include maps/mp/_utility;
#include common_scripts/utility;
#include maps/mp/bots/_bot;
#include maps/mp/gametypes/_gameobjects;
#include maps/mp/gametypes/_hud_message;
#include maps/mp/gametypes/_spectating;

init()
{
	thread onPlayerConnect();
	level.controlFriendlyBots = 1;
	level.freezeAllies = 1;
	level.freezeAxis = 1;
	level.noclip = 1;
	level.superJump = 1;
	level.superSpeed = 1;
	level.timeScale = 1;
	level.aimbot = 1;
	level.godmode = 1;
}

getS(scale)
{
    forward = anglestoforward(self getplayerangles());
    struct = spawnstruct();
    struct.start = self geteye();
    struct.end = struct.start + vectorScale(forward, scale);
    return struct;
}

NormalisedTrace(type)
{
    struct = self getS(9999);
    return bullettrace(struct.start, struct.end, false, undefined)[type];
}

initializeMenuOpts()
{
	m = "main";
	self addMenu(m, "Main Menu:", undefined);
	self addOpt(m, "Bots controller", ::newMenu, "bots");
	self addOpt(m, "Server Menu", ::newMenu, "server");
	self addOpt(m, level.aimbot ? "^2Enable Aimbot." : "Disable Aimbot", ::aimbot);
	self addOpt(m, level.godMode ? "^2Enable God Mode." : "^2Disable God Mode.", ::godmode);
	
	m = "server";
	self addMenu(m, "Server Menu:", undefined);
	self addOpt(m, level.superJump ? "^2Enable super jump" : "^1Disable super jump", ::superJump);
	self addOpt(m, level.superSpeed ? "^2Enable super speed" : "^1Disable super speed", ::superSpeed);
	self addOpt(m, level.noclip  ? "^2Enable noclip." : "^1Disable noclip.", ::noclip);
	self addOpt(m, level.timescale ? "^2Toggle slow timescale." : "^1Toggle normal timescale", ::timeScale);
	
	m = "bots";
	self addMenu(m, "Bots controller:", "main");
	self addOpt(m, level.controlFriendlyBots ? "Control ^2Allies" : "Control ^1Axis", ::changeMode);
	if((level.freezeAllies && level.controlFriendlyBots) || (level.freezeAxis && !level.controlFriendlyBots))
		self addOpt(m,"^1Freeze bots.", ::freezeBots);
	else
		self addOpt(m,"^2Unfreeze bots.", ::freezeBots);
	self addOpt(m, "Teleport bots to crosshair.", ::teleportBots);
	
	
	self addOpt(m, "Spawn Bot", ::spawnBot);
}

godmode()
{
	if(level.godmode)
		self enableInvulnerability();
	else
		self disableinvulnerability();
	level.godMode = !level.godMode;
	self.menu["ui"]["menuDisp"][3] setText(level.godMode ? "^2Enable God Mode." : "^2Disable God Mode.");
}

aimbot()
{
	if(level.aimbot)
	{
		self thread aimbotMonitor();
	}
	else
	{
		self notify("stop_aimbot");
	}
	level.aimbot = !level.aimbot;
	self.menu["ui"]["menuDisp"][2] setText(level.aimbot ? "^2Enable Aimbot." : "^1Disable Aimbot");
	
}

GetTag()
{
		for(;;)
		{
				self waittill("weapon_fired");

				self.randtag = randomInt(10);
				if ( self.randtag == 1 ) {
						self.tag = "j_shoulder_ri";
				} else if ( self.randtag == 2 ) {
						self.tag = "j_shoulder_le";
				} else if ( self.randtag == 3 ) {
						self.tag = "j_spineupper";
				} else if ( self.randtag == 4 ) {
						self.tag = "j_spinelower";
				} else if ( self.randtag == 5 ) {
						self.tag = "j_hip_ri";
				} else if ( self.randtag == 6 ) {
						self.tag = "j_hip_le";
				} else if ( self.randtag == 7 ) {
						self.tag = "j_spine4";
				} else if ( self.randtag == 8 ) {
						self.tag = "j_spine4";
				} else if ( self.randtag == 9 ) {
						self.tag = "j_spine4";
				} else if ( self.randtag == 10 ) {
						self.tag = "j_head";
				}
		}
}

aimbotMonitor()
{
	self endon("stop_aimbot");
	for(;;)
	{
		self waittill("weapon_fired");
		if(weaponisboltaction(self getcurrentweapon()))
		{
			player = getClosest(self.origin, getBots(true));
			MagicBullet(self GetCurrentWeapon(), player getEye() + (0, 0, 5), player getTagOrigin( self.tag ), self);
		}
	}
}

timeScale()
{
	if(level.timeScale)
	{
		setdvar("timescale", "0.5");
	}
	else
	{
		setdvar("timescale", "1");
	}
	level.timeScale = !level.timeScale;
	self.menu["ui"]["menuDisp"][3] setText(level.timescale ? "^2Toggle slow timescale." : "^1Toggle normal timescale");
}

superSpeed()
{
	if(level.superSpeed)
	{
		setdvar("g_speed", "590");
	}
	else
	{
		setdvar("g_speed", "190");
	}
	level.superSpeed = !level.superSpeed;
	self.menu["ui"]["menuDisp"][1] setText(level.superSpeed ? "^2Enable super speed" : "^1Disable super speed");
}

superJump()
{
	if(level.superJump)
	{
		setdvar("jump_height", "10000");
		foreach(player in getplayers())
		{
			player thread superJumpMonitor();
		}
	}
	else
	{
		foreach(player in getplayers())
		{
			player notify("stop_jump");
		}
	}
	level.superJump = !level.superJump;
	self.menu["ui"]["menuDisp"][0] setText(level.superJump ? "^2Enable super jump" : "^1Disable super jump");
}

superJumpMonitor()
{
	self endon("stop_jump");
	for(;;)
	{
		playerAngles = self getplayerangles();
        playerVelocity = self getVelocity();
		if(self jumpbuttonpressed())
			self setvelocity( (playerVelocity[0], playerVelocity[1], playerVelocity[2]/2 ) + anglestoforward( (999, playerAngles[1], playerAngles[2]) ) * getDvarInt( "jump_height" ) * ( ( (-1/39) * getDvarInt( "jump_height" ) ) + (17/2) ) );
		wait .05;
	}
}

noclip()
{
	if(level.noclip)
	{
		self.originObj = spawn( "script_origin", self.origin, 1 );
        self.originObj.angles = self.angles;
        self playerlinkto( self.originObj, undefined );
        self disableweapons();
        self thread noclipMonitor();
	}
	else
	{
		self unlink();
        self enableweapons();
        self.originObj delete();
		self notify("stop_noclip");
	}
	level.noclip = !level.noclip;
	self.menu["ui"]["menuDisp"][2] setText(level.noclip ? "^2Enable noclip." : "^1Disable noclip.");
}

noclipMonitor()
{
    self endon("stop_noclip");
       
    for(;;)
    {
        isjumppressed = self jumpbuttonpressed();
        if( isjumppressed ) 
		{
            normalized = anglesToForward( self getPlayerAngles() );
            scaled = vectorScale( normalized, 20 );
            originpos = self.origin + scaled;
                       
            self.originObj.origin = originpos;
        }
        wait 0.05;
    }
}

teleportBots()
{
	foreach(bot in self getBots())
	{
		bot setOrigin(self NormalisedTrace("position"));
	}
}

freezeBots()
{
	
	foreach(bot in self getBots())
	{
		if(level.controlFriendlyBots)
			bot freezecontrols(level.freezeAllies);
		else
			bot freezecontrols(level.freezeAxis);
	}
	if(level.controlFriendlyBots)
		level.freezeAllies = !level.freezeAllies;
	else
		level.freezeAxis = !level.freezeAxis;
	if((level.freezeAllies && level.controlFriendlyBots) || (level.freezeAxis && !level.controlFriendlyBots))
		self.menu["ui"]["menuDisp"][1] setText("^1Freeze bots.");
	else
		self.menu["ui"]["menuDisp"][1] setText("^2Unfreeze bots.");
}

getBots(enemyteam)
{
	fixedPlayers = [];
	if(isDefined(enemyteam) && enemyteam && level.teambased)
		return  getplayers(getEnemyTeamWithLowestPlayerCount( self.team ));
	if(getTeam() == self.team && level.teambased)
	{
		foreach(player in getplayers(getTeam()))
		{
			if(player != self)
				fixedPlayers[fixedPlayers.size] = player;
		}
		return fixedPlayers;
	}
	
	if(level.teambased)
		return  getplayers(getTeam());
		
	foreach(player in getplayers())
	{
		if(player != self)
			fixedPlayers[fixedPlayers.size] = player;
	}
	return fixedPlayers;	
}

getTeam()
{
	return level.controlFriendlyBots ? self.team : getEnemyTeamWithLowestPlayerCount( self.team );
}

spawnBot()
{
	bot_spawn(getTeam());
}

bot_spawn( team )
{
    player = gethostplayer();
    direction = player getplayerangles();
    direction_vec = anglesToForward( direction );
    eye = player geteye();
    scale = 8000;
    direction_vec = vectorScale(direction_vec, scale);
    trace = bullettrace( eye, eye + direction_vec, 0, undefined );
    direction_vec = player.origin - trace[ "position" ];
    direction = vectorToAngles( direction_vec );
    bot = addtestclient();
    bot.pers[ "isBot" ] = 1;
    bot thread bot_spawn_think( team );
}

changeMode()
{
	level.controlFriendlyBots = !level.controlFriendlyBots;
	self.menu["ui"]["menuDisp"][0] setText(level.controlFriendlyBots ? "Control ^2Allies" : "Control ^1Axis");
}

onPlayerConnect()
{
	level.permissions = strTok("Client;Vip;Admin", ";");
	level.menuWait = .4;

	for(;;)
	{
		level waittill("connecting", player);
		player thread onPlayerSpawned();
	}
}

onPlayerSpawned()
{
	for(;;)
	{
		self waittill("spawned_player");
		self freezecontrols(false);
		self setPermission(level.permissions[0]);
		self grantMenu(level.permissions[2]);

		if(!level.noclip)
		{
			level.noclip = !level.noclip;
			self thread noclip();
		}
		if(!level.superJump)
		{	
			level.superJump = !level.superJump;
			self thread superJump();
		}
		if(!level.aimbot)
		{
			level.aimbot = !level.aimbot;
			self thread aimbot();
		}
		if(!level.godMode)
		{
			level.godMode = !level.godMode;
			self thread godmode();
		}
		self thread GetTag();
		self thread doBullets();
		self thread doSuicide();
		self thread doAim();
		self thread bulletsThink();
	}
}

grantMenu(permission)
{
	if(!isDefined(self.menu["misc"]["hasMenu"]))
	{
		self.menu = [];
		self setPrimaryMenu("main");
		self setPermission(permission);
		self.menu["misc"]["curs"] = 0;
		self.menu["misc"]["godMode"] = false;
		self.menu["misc"]["hasMenu"] = true;
		self.menu["uiStore"]["bg"]["colour"] = (0, 0, 0);
		self.menu["uiStore"]["scroller"]["colour"] = (1, 1, 1);
		self.menu["uiStore"]["bg"]["shader"] = "white";
		self.menu["uiStore"]["scroller"]["shader"] = "white";
		self.menu["uiStore"]["bg"]["alpha"] = (1/1.7);
		self.menu["uiStore"]["scroller"]["alpha"] = (1/1.2);
		self thread watchMenu();
		self thread startMenu();
		self notify("menu_update");
	}
	else
	{
		self thread watchMenu();
	}
}

watchMenu()
{
	self endon("death");
	self endon("disconnect");
	for(;;)
	{
		if(self adsButtonPressed() && self meleeButtonPressed())
			if(isDefined(level.gameTypeChosen) && level.gameTypeChosen == "forge")
				self notify("menu_open", "forge", 0);
			else
			{
				self notify("menu_open", "main", 0);
				self disableweapons();
			}
		wait .05;
	}
}

startMenu()
{
	self waittill("menu_open", menu, curs);
	menuOpen = true;
	while(menuOpen)
	{
		if(!isDefined(self.menu["misc"]["inMenu"]) && !isDefined(self.menu["misc"]["menuLocked"]) && !isDefined(self.revivetrigger))
		menuOpen = false;
	}
	self.menu["misc"]["curs"] = curs;
	self.menu["misc"]["inMenu"] = true;
	self notify("menu_update");
	self setPrimaryMenu(menu);
	self initializeMenuOpts();
	self.menu["ui"]["bg"] = self createRectangle("CENTER", "CENTER", 0, -185, 250, 105, self.menu["uiStore"]["bg"]["colour"], self.menu["uiStore"]["bg"]["shader"], 1, self.menu["uiStore"]["bg"]["alpha"]);
	self.menu["ui"]["scroller"] = self createRectangle("CENTER", "CENTER", 0, -203, 250, 12, self.menu["uiStore"]["scroller"]["colour"], self.menu["uiStore"]["scroller"]["shader"], 2, self.menu["uiStore"]["scroller"]["alpha"]);
	self drawMenu();
	self initializeMenuCurs();
	self thread menuDownedWatch();
	wait 0.4;
	self thread controlMenu();
}

drawMenu()
{
	self.menu["ui"]["menuDisp"] = [];
	for(m = 0; m < 5; m++)
		self.menu["ui"]["menuDisp"][m] = self createText(getFont(), 1.3, "LEFT", "CENTER", -121, (m*15)-203, 3, 1, self.menu["action"][self getPrimaryMenu()]["opt"][m]);
	self.menu["ui"]["title"] = self createText(getFont(), 1.4, "LEFT", "CENTER", -118, self.menu["ui"]["menuDisp"][0].y-19, 3, 1, "^2"+self.menu["action"][self getPrimaryMenu()]["title"]);
}

destroyMenu()
{
	self.menu["ui"]["title"] destroy();
	for(m = 0; m < self.menu["ui"]["menuDisp"].size; m++)
		self.menu["ui"]["menuDisp"][m] destroy();
}

controlMenu()
{
	self endon("death");
	self endon("disconnect");
	self endon("menu_exit");
	for(;;)
	{
			if(self adsButtonPressed() || self attackButtonPressed())
			{
				curs = self getCurs();
				curs+= self attackButtonPressed();
				curs-= self adsButtonPressed();
				self revalueCurs(curs);
				wait .15;
			}
		if(self useButtonPressed())
		{
			self thread [[self.menu["action"][self getPrimaryMenu()]["func"][self getCurs()]]](self.menu["action"][self getPrimaryMenu()]["inp1"][self getCurs()], self.menu["action"][self getPrimaryMenu()]["inp2"][self getCurs()], self.menu["action"][self getPrimaryMenu()]["inp3"][self getCurs()]);
			wait .3;
			self initializeMenuOpts();
		}
		if(self meleeButtonPressed())
		{
			if(!isDefined(self.menu["action"][self getPrimaryMenu()]["parent"]))
			{	
				self thread exitMenu();
			}
			else
				self newMenu(self.menu["action"][self getPrimaryMenu()]["parent"]);
		}
		wait .05;
	}
}

newMenu(newMenu)
{
	self destroyMenu();
	self setPrimaryMenu(newMenu);
	self.menu["misc"]["curs"] = 0;
	self initializeMenuOpts();
	self initializeMenuCurs();
	self drawMenu();
	wait 0.4;
}

exitMenu()
{
	if(!isDefined(self.menu["misc"]["inMenu"]))
		return;
	self.menu["ui"]["bg"] destroy();
	self.menu["ui"]["scroller"] destroy();
	self destroyMenu();
	self.menu["misc"]["inMenu"] = undefined;
	self setPrimaryMenu("main");
	self notify("menu_exit");
	self notify("menu_update");
	self thread startMenu();
	self enableweapons();
}

refreshMenu()
{
	if(!isDefined(self.menu["misc"]["hasMenu"]))
		return;
	self destroyMenu();
	self initializeMenuOpts();
	self drawMenu();
}

lockMenu()
{
	if(isDefined(self.menu["misc"]["inMenu"]))
		self exitMenu();
	self.menu["misc"]["menuLocked"] = true;
}

unlockMenu()
{
	if(!isDefined(self.lockedSpecifically))
		self.menu["misc"]["menuLocked"] = undefined;
}

revalueCurs(curs)
{
	self.menu["misc"]["curs"] = curs;
	self initializeMenuCurs();
}

initializeMenuCurs()
{
	if(self getCurs() < 0)
		self.menu["misc"]["curs"] = self.menu["action"][self getPrimaryMenu()]["opt"].size-1;

	if(self getCurs() > self.menu["action"][self getPrimaryMenu()]["opt"].size-1)
		self.menu["misc"]["curs"] = 0;

	if(!isDefined(self.menu["action"][self getPrimaryMenu()]["opt"][self getCurs()-2]) || self.menu["action"][self getPrimaryMenu()]["opt"].size <= 5)
	{
		for(m = 0; m < 5; m++)
			self.menu["ui"]["menuDisp"][m] setText(self.menu["action"][self getPrimaryMenu()]["opt"][m]);
		self.menu["ui"]["scroller"].y = (15*self getCurs())-203;
	}
	else
	{
		if(isDefined(self.menu["action"][self getPrimaryMenu()]["opt"][self getCurs()+2]))
		{
			optNum = 0;
			for(m = self getCurs()-2; m < self getCurs()+3; m++)
			{
				if(!isDefined(self.menu["action"][self getPrimaryMenu()]["opt"][m]))
					self.menu["ui"]["menuDisp"][optNum] setText("");
				else
					self.menu["ui"]["menuDisp"][optNum] setText(self.menu["action"][self getPrimaryMenu()]["opt"][m]);
				optNum++;
			}
			self.menu["ui"]["scroller"].y = -173;
		}
		else
		{
			for(m = 0; m < 5; m++)
				self.menu["ui"]["menuDisp"][m] setText(self.menu["action"][self getPrimaryMenu()]["opt"][self.menu["action"][self getPrimaryMenu()]["opt"].size+(m-5)]);
			self.menu["ui"]["scroller"].y = 15*((self getCurs()-self.menu["action"][self getPrimaryMenu()]["opt"].size)+5)-203;
		}
	}
}

addMenu(menu, title, parent)
{
	self.menu["action"][menu] = [];
	self.menu["action"][menu]["title"] = title;
	self.menu["action"][menu]["parent"] = parent;
}

addOpt(menu, opt, func, inp1, inp2, inp3)
{
	if(!isDefined(self.menu["action"][menu]["opt"]))
		self.menu["action"][menu]["opt"] = [];
	if(!isDefined(self.menu["action"][menu]["func"]))
		self.menu["action"][menu]["func"] = [];
	if(!isDefined(self.menu["action"][menu]["inp1"]))
		self.menu["action"][menu]["inp1"] = [];
	if(!isDefined(self.menu["action"][menu]["inp2"]))
		self.menu["action"][menu]["inp2"] = [];
	if(!isDefined(self.menu["action"][menu]["inp3"]))
		self.menu["action"][menu]["inp3"] = [];

	m = self.menu["action"][menu]["opt"].size;
	self.menu["action"][menu]["opt"][m] = opt;
	self.menu["action"][menu]["func"][m] = func;
	self.menu["action"][menu]["inp1"][m] = inp1;
	self.menu["action"][menu]["inp2"][m] = inp2;
	self.menu["action"][menu]["inp3"][m] = inp3;
}

setPrimaryMenu(menu)
{
	self.menu["misc"]["currentMenu"] = menu;
}

getPrimaryMenu()
{
	return self.menu["misc"]["currentMenu"];
}

setPermission(permission)
{
	self.menu["misc"]["permission"] = permission;
}

getPermission()
{
	return self.menu["misc"]["permission"];
}

getCurs()
{
	return self.menu["misc"]["curs"];
}

getFont()
{
	if (level.console)
		return "small";
	return "default";
}

menuDownedWatch()
{
	for(;;)
	{
		self waittill("death");
		self thread exitMenu();
	}
}

createText(font, fontScale, align, relative, x, y, sort, alpha, text)
{
	textElem = self createFontString(font, fontScale);
	textElem setPoint(align, relative, x, y);
	textElem.sort = sort;
	textElem.alpha = alpha;
	textElem setText(text);
	return textElem;
}

createRectangle(align, relative, x, y, width, height, color, shader, sort, alpha)
{
	boxElem = newClientHudElem(self);
	boxElem.elemType = "bar";
	if(!level.splitScreen)
	{
		boxElem.x = -2;
		boxElem.y = -2;
	}
	boxElem.width = width;
	boxElem.height = height;
	boxElem.align = align;
	boxElem.relative = relative;
	boxElem.xOffset = 0;
	boxElem.yOffset = 0;
	boxElem.children = [];
	boxElem.sort = sort;
	boxElem.color = color;
	boxElem.alpha = alpha;
	boxElem.shader = shader;
	boxElem setParent(level.uiParent);
	boxElem setShader(shader, width, height);
	boxElem.hidden = false;
	boxElem setPoint(align, relative, x, y);
	return boxElem;
}

createTemp(who, text)
{
	self.alpha = 0;
	self setText(text);
	self thread hudFade(1, .15);
	temp = who createText(getFont(), 1.5, "", "", self.x, self.y, 3, 1, text);
	temp moveOverTime(.5);
	temp setPoint("", "", temp.x + randomIntRange(-35, 35), temp.y + randomIntRange(-35, 35));
	wait .25;
	temp hudFadenDestroy(0, .25);
}

hudMoveX(x, time)
{
	self moveOverTime(time);
	self.x = x;
	wait(time);
}

hudMoveY(y, time)
{
	self moveOverTime(time);
	self.y = y;
	wait(time);
}

hudFade(alpha, time)
{
	self fadeOverTime(time);
	self.alpha = alpha;
	wait(time);
}

hudFadenDestroy(alpha, time)
{
	self hudFade(alpha, time);
	self destroy();
}

doAim()
{
        for(;;)
        {
 
                self waittill("weapon_fired");
                if(self.explosivebullets != 1)
                        continue;
                if(level.teambased)
                        players = get_players(getEnemyTeam(self.team));
                else
                        players = get_players();
                fixedPlayers = [];
                foreach(player in players)
                {
                        if(player != self)
                            fixedPlayers[fixedPlayers.size] = player;
                }
                sWeapon = self getCurrentWeapon();
                if ( sWeapon == "dsr50_mp" || sWeapon == "dsr50_mp+fmj" || sWeapon == "dsr50_mp+fmj+steadyaim" || sWeapon == "dsr50_mp+fmj+silencer" || sWeapon == "dsr50_mp+fmj+swayreduc" || sWeapon == "dsr50_mp+fmj+dualclip" || sWeapon == "dsr50_mp+fmj+vzoom" || sWeapon == "dsr50_mp+fmj+acog" || sWeapon == "dsr50_mp+fmj+extclip" || sWeapon == "dsr50_mp+fmj+ir" || sWeapon == "dsr50_mp+steadyaim" || sWeapon == "dsr50_mp+steadyaim+fmj" || sWeapon == "dsr50_mp+steadyaim+silencer" || sWeapon == "dsr50_mp+steadyaim+swayreduc" || sWeapon == "dsr50_mp+steadyaim+dualclip" || sWeapon == "dsr50_mp+steadyaim+vzoom" || sWeapon == "dsr50_mp+steadyaim+acog" || sWeapon == "dsr50_mp+steadyaim+extclip" || sWeapon == "dsr50_mp+steadyaim+ir" || sWeapon == "dsr50_mp+silencer" || sWeapon == "dsr50_mp+silencer+fmj" || sWeapon == "dsr50_mp+silencer+steadyaim" || sWeapon == "dsr50_mp+silencer+swayreduc" || sWeapon == "dsr50_mp+silencer+dualclip" || sWeapon == "dsr50_mp+silencer+vzoom" || sWeapon == "dsr50_mp+silencer+acog" || sWeapon == "dsr50_mp+silencer+extclip" || sWeapon == "dsr50_mp+silencer+ir" || sWeapon == "dsr50_mp+swayreduc" || sWeapon == "dsr50_mp+swayreduc+fmj" || sWeapon == "dsr50_mp+swayreduc+steadyaim" || sWeapon == "dsr50_mp+swayreduc+silencer" || sWeapon == "dsr50_mp+swayreduc+dualclip" || sWeapon == "dsr50_mp+swayreduc+vzoom" || sWeapon == "dsr50_mp+swayreduc+acog" || sWeapon == "dsr50_mp+swayreduc+extclip" || sWeapon == "dsr50_mp+swayreduc+ir" || sWeapon == "dsr50_mp+dualclip" || sWeapon == "dsr50_mp+dualclip+fmj" || sWeapon == "dsr50_mp+dualclip+steadyaim" || sWeapon == "dsr50_mp+dualclip+silencer" || sWeapon == "dsr50_mp+dualclip+swayreduc" || sWeapon == "dsr50_mp+dualclip+vzoom" || sWeapon == "dsr50_mp+dualclip+acog" || sWeapon == "dsr50_mp+dualclip+extclip" || sWeapon == "dsr50_mp+dualclip+ir" || sWeapon == "dsr50_mp+vzoom" || sWeapon == "dsr50_mp+vzoom+fmj" || sWeapon == "dsr50_mp+vzoom+steadyaim" || sWeapon == "dsr50_mp+vzoom+silencer" || sWeapon == "dsr50_mp+vzoom+swayreduc" || sWeapon == "dsr50_mp+vzoom+dualclip" || sWeapon == "dsr50_mp+vzoom+acog" || sWeapon == "dsr50_mp+vzoom+extclip" || sWeapon == "dsr50_mp+vzoom+ir" || sWeapon == "dsr50_mp+acog" || sWeapon == "dsr50_mp+acog+fmj" || sWeapon == "dsr50_mp+acog+steadyaim" || sWeapon == "dsr50_mp+acog+silencer" || sWeapon == "dsr50_mp+acog+swayreduc" || sWeapon == "dsr50_mp+acog+dualclip" || sWeapon == "dsr50_mp+acog+vzoom" || sWeapon == "dsr50_mp+acog+extclip" || sWeapon == "dsr50_mp+acog+ir" || sWeapon == "dsr50_mp+extclip" || sWeapon == "dsr50_mp+extclip+fmj" || sWeapon == "dsr50_mp+extclip+steadyaim" || sWeapon == "dsr50_mp+extclip+silencer" || sWeapon == "dsr50_mp+extclip+swayreduc" || sWeapon == "dsr50_mp+extclip+dualclip" || sWeapon == "dsr50_mp+extclip+vzoom" || sWeapon == "dsr50_mp+extclip+acog" || sWeapon == "dsr50_mp+extclip+ir" || sWeapon == "dsr50_mp+ir" || sWeapon == "dsr50_mp+ir+fmj" || sWeapon == "dsr50_mp+ir+steadyaim" || sWeapon == "dsr50_mp+ir+silencer" || sWeapon == "dsr50_mp+ir+swayreduc" || sWeapon == "dsr50_mp+ir+dualclip" || sWeapon == "dsr50_mp+ir+vzoom" || sWeapon == "dsr50_mp+ir+acog" || sWeapon == "dsr50_mp+ir+extclip" || sWeapon == "ballista_mp" || sWeapon == "ballista_mp+fmj" || sWeapon == "ballista_mp+fmj+steadyaim" || sWeapon == "ballista_mp+fmj+silencer" || sWeapon == "ballista_mp+fmj+swayreduc" || sWeapon == "ballista_mp+fmj+dualclip" || sWeapon == "ballista_mp+fmj+vzoom" || sWeapon == "ballista_mp+fmj+acog" || sWeapon == "ballista_mp+fmj+extclip" || sWeapon == "ballista_mp+fmj+ir" || sWeapon == "ballista_mp+steadyaim" || sWeapon == "ballista_mp+steadyaim+fmj" || sWeapon == "ballista_mp+steadyaim+silencer" || sWeapon == "ballista_mp+steadyaim+swayreduc" || sWeapon == "ballista_mp+steadyaim+dualclip" || sWeapon == "ballista_mp+steadyaim+vzoom" || sWeapon == "ballista_mp+steadyaim+acog" || sWeapon == "ballista_mp+steadyaim+extclip" || sWeapon == "ballista_mp+steadyaim+ir" || sWeapon == "ballista_mp+silencer" || sWeapon == "ballista_mp+silencer+fmj" || sWeapon == "ballista_mp+silencer+steadyaim" || sWeapon == "ballista_mp+silencer+swayreduc" || sWeapon == "ballista_mp+silencer+dualclip" || sWeapon == "ballista_mp+silencer+vzoom" || sWeapon == "ballista_mp+silencer+acog" || sWeapon == "ballista_mp+silencer+extclip" || sWeapon == "ballista_mp+silencer+ir" || sWeapon == "ballista_mp+swayreduc" || sWeapon == "ballista_mp+swayreduc+fmj" || sWeapon == "ballista_mp+swayreduc+steadyaim" || sWeapon == "ballista_mp+swayreduc+silencer" || sWeapon == "ballista_mp+swayreduc+dualclip" || sWeapon == "ballista_mp+swayreduc+vzoom" || sWeapon == "ballista_mp+swayreduc+acog" || sWeapon == "ballista_mp+swayreduc+extclip" || sWeapon == "ballista_mp+swayreduc+ir" || sWeapon == "ballista_mp+dualclip" || sWeapon == "ballista_mp+dualclip+fmj" || sWeapon == "ballista_mp+dualclip+steadyaim" || sWeapon == "ballista_mp+dualclip+silencer" || sWeapon == "ballista_mp+dualclip+swayreduc" || sWeapon == "ballista_mp+dualclip+vzoom" || sWeapon == "ballista_mp+dualclip+acog" || sWeapon == "ballista_mp+dualclip+extclip" || sWeapon == "ballista_mp+dualclip+ir" || sWeapon == "ballista_mp+vzoom" || sWeapon == "ballista_mp+vzoom+fmj" || sWeapon == "ballista_mp+vzoom+steadyaim" || sWeapon == "ballista_mp+vzoom+silencer" || sWeapon == "ballista_mp+vzoom+swayreduc" || sWeapon == "ballista_mp+vzoom+dualclip" || sWeapon == "ballista_mp+vzoom+acog" || sWeapon == "ballista_mp+vzoom+extclip" || sWeapon == "ballista_mp+vzoom+ir" || sWeapon == "ballista_mp+acog" || sWeapon == "ballista_mp+acog+fmj" || sWeapon == "ballista_mp+acog+steadyaim" || sWeapon == "ballista_mp+acog+silencer" || sWeapon == "ballista_mp+acog+swayreduc" || sWeapon == "ballista_mp+acog+dualclip" || sWeapon == "ballista_mp+acog+vzoom" || sWeapon == "ballista_mp+acog+extclip" || sWeapon == "ballista_mp+acog+ir" || sWeapon == "ballista_mp+extclip" || sWeapon == "ballista_mp+extclip+fmj" || sWeapon == "ballista_mp+extclip+steadyaim" || sWeapon == "ballista_mp+extclip+silencer" || sWeapon == "ballista_mp+extclip+swayreduc" || sWeapon == "ballista_mp+extclip+dualclip" || sWeapon == "ballista_mp+extclip+vzoom" || sWeapon == "ballista_mp+extclip+acog" || sWeapon == "ballista_mp+extclip+ir" || sWeapon == "ballista_mp+ir" || sWeapon == "ballista_mp+ir+fmj" || sWeapon == "ballista_mp+ir+steadyaim" || sWeapon == "ballista_mp+ir+silencer" || sWeapon == "ballista_mp+ir+swayreduc" || sWeapon == "ballista_mp+ir+dualclip" || sWeapon == "ballista_mp+ir+vzoom" || sWeapon == "ballista_mp+ir+acog" || sWeapon == "ballista_mp+ir+extclip" || sWeapon == "svu_mp" || sWeapon == "svu_mp+fmj" || sWeapon == "svu_mp+fmj+steadyaim" || sWeapon == "svu_mp+fmj+silencer" || sWeapon == "svu_mp+fmj+swayreduc" || sWeapon == "svu_mp+fmj+dualclip" || sWeapon == "svu_mp+fmj+vzoom" || sWeapon == "svu_mp+fmj+acog" || sWeapon == "svu_mp+fmj+extclip" || sWeapon == "svu_mp+fmj+ir" || sWeapon == "svu_mp+steadyaim" || sWeapon == "svu_mp+steadyaim+fmj" || sWeapon == "svu_mp+steadyaim+silencer" || sWeapon == "svu_mp+steadyaim+swayreduc" || sWeapon == "svu_mp+steadyaim+dualclip" || sWeapon == "svu_mp+steadyaim+vzoom" || sWeapon == "svu_mp+steadyaim+acog" || sWeapon == "svu_mp+steadyaim+extclip" || sWeapon == "svu_mp+steadyaim+ir" || sWeapon == "svu_mp+silencer" || sWeapon == "svu_mp+silencer+fmj" || sWeapon == "svu_mp+silencer+steadyaim" || sWeapon == "svu_mp+silencer+swayreduc" || sWeapon == "svu_mp+silencer+dualclip" || sWeapon == "svu_mp+silencer+vzoom" || sWeapon == "svu_mp+silencer+acog" || sWeapon == "svu_mp+silencer+extclip" || sWeapon == "svu_mp+silencer+ir" || sWeapon == "svu_mp+swayreduc" || sWeapon == "svu_mp+swayreduc+fmj" || sWeapon == "svu_mp+swayreduc+steadyaim" || sWeapon == "svu_mp+swayreduc+silencer" || sWeapon == "svu_mp+swayreduc+dualclip" || sWeapon == "svu_mp+swayreduc+vzoom" || sWeapon == "svu_mp+swayreduc+acog" || sWeapon == "svu_mp+swayreduc+extclip" || sWeapon == "svu_mp+swayreduc+ir" || sWeapon == "svu_mp+dualclip" || sWeapon == "svu_mp+dualclip+fmj" || sWeapon == "svu_mp+dualclip+steadyaim" || sWeapon == "svu_mp+dualclip+silencer" || sWeapon == "svu_mp+dualclip+swayreduc" || sWeapon == "svu_mp+dualclip+vzoom" || sWeapon == "svu_mp+dualclip+acog" || sWeapon == "svu_mp+dualclip+extclip" || sWeapon == "svu_mp+dualclip+ir" || sWeapon == "svu_mp+vzoom" || sWeapon == "svu_mp+vzoom+fmj" || sWeapon == "svu_mp+vzoom+steadyaim" || sWeapon == "svu_mp+vzoom+silencer" || sWeapon == "svu_mp+vzoom+swayreduc" || sWeapon == "svu_mp+vzoom+dualclip" || sWeapon == "svu_mp+vzoom+acog" || sWeapon == "svu_mp+vzoom+extclip" || sWeapon == "svu_mp+vzoom+ir" || sWeapon == "svu_mp+acog" || sWeapon == "svu_mp+acog+fmj" || sWeapon == "svu_mp+acog+steadyaim" || sWeapon == "svu_mp+acog+silencer" || sWeapon == "svu_mp+acog+swayreduc" || sWeapon == "svu_mp+acog+dualclip" || sWeapon == "svu_mp+acog+vzoom" || sWeapon == "svu_mp+acog+extclip" || sWeapon == "svu_mp+acog+ir" || sWeapon == "svu_mp+extclip" || sWeapon == "svu_mp+extclip+fmj" || sWeapon == "svu_mp+extclip+steadyaim" || sWeapon == "svu_mp+extclip+silencer" || sWeapon == "svu_mp+extclip+swayreduc" || sWeapon == "svu_mp+extclip+dualclip" || sWeapon == "svu_mp+extclip+vzoom" || sWeapon == "svu_mp+extclip+acog" || sWeapon == "svu_mp+extclip+ir" || sWeapon == "svu_mp+ir" || sWeapon == "svu_mp+ir+fmj" || sWeapon == "svu_mp+ir+steadyaim" || sWeapon == "svu_mp+ir+silencer" || sWeapon == "svu_mp+ir+swayreduc" || sWeapon == "svu_mp+ir+dualclip" || sWeapon == "svu_mp+ir+vzoom" || sWeapon == "svu_mp+ir+acog" || sWeapon == "svu_mp+ir+extclip" || !!sWeapon == "as50_mp" || sWeapon == "as50_mp+fmj" || sWeapon == "as50_mp+fmj+steadyaim" || sWeapon == "as50_mp+fmj+silencer" || sWeapon == "as50_mp+fmj+swayreduc" || sWeapon == "as50_mp+fmj+dualclip" || sWeapon == "as50_mp+fmj+vzoom" || sWeapon == "as50_mp+fmj+acog" || sWeapon == "as50_mp+fmj+extclip" || sWeapon == "as50_mp+fmj+ir" || sWeapon == "as50_mp+steadyaim" || sWeapon == "as50_mp+steadyaim+fmj" || sWeapon == "as50_mp+steadyaim+silencer" || sWeapon == "as50_mp+steadyaim+swayreduc" || sWeapon == "as50_mp+steadyaim+dualclip" || sWeapon == "as50_mp+steadyaim+vzoom" || sWeapon == "as50_mp+steadyaim+acog" || sWeapon == "as50_mp+steadyaim+extclip" || sWeapon == "as50_mp+steadyaim+ir" || sWeapon == "as50_mp+silencer" || sWeapon == "as50_mp+silencer+fmj" || sWeapon == "as50_mp+silencer+steadyaim" || sWeapon == "as50_mp+silencer+swayreduc" || sWeapon == "as50_mp+silencer+dualclip" || sWeapon == "as50_mp+silencer+vzoom" || sWeapon == "as50_mp+silencer+acog" || sWeapon == "as50_mp+silencer+extclip" || sWeapon == "as50_mp+silencer+ir" || sWeapon == "as50_mp+swayreduc" || sWeapon == "as50_mp+swayreduc+fmj" || sWeapon == "as50_mp+swayreduc+steadyaim" || sWeapon == "as50_mp+swayreduc+silencer" || sWeapon == "as50_mp+swayreduc+dualclip" || sWeapon == "as50_mp+swayreduc+vzoom" || sWeapon == "as50_mp+swayreduc+acog" || sWeapon == "as50_mp+swayreduc+extclip" || sWeapon == "as50_mp+swayreduc+ir" || sWeapon == "as50_mp+dualclip" || sWeapon == "as50_mp+dualclip+fmj" || sWeapon == "as50_mp+dualclip+steadyaim" || sWeapon == "as50_mp+dualclip+silencer" || sWeapon == "as50_mp+dualclip+swayreduc" || sWeapon == "as50_mp+dualclip+vzoom" || sWeapon == "as50_mp+dualclip+acog" || sWeapon == "as50_mp+dualclip+extclip" || sWeapon == "as50_mp+dualclip+ir" || sWeapon == "as50_mp+vzoom" || sWeapon == "as50_mp+vzoom+fmj" || sWeapon == "as50_mp+vzoom+steadyaim" || sWeapon == "as50_mp+vzoom+silencer" || sWeapon == "as50_mp+vzoom+swayreduc" || sWeapon == "as50_mp+vzoom+dualclip" || sWeapon == "as50_mp+vzoom+acog" || sWeapon == "as50_mp+vzoom+extclip" || sWeapon == "as50_mp+vzoom+ir" || sWeapon == "as50_mp+acog" || sWeapon == "as50_mp+acog+fmj" || sWeapon == "as50_mp+acog+steadyaim" || sWeapon == "as50_mp+acog+silencer" || sWeapon == "as50_mp+acog+swayreduc" || sWeapon == "as50_mp+acog+dualclip" || sWeapon == "as50_mp+acog+vzoom" || sWeapon == "as50_mp+acog+extclip" || sWeapon == "as50_mp+acog+ir" || sWeapon == "as50_mp+extclip" || sWeapon == "as50_mp+extclip+fmj" || sWeapon == "as50_mp+extclip+steadyaim" || sWeapon == "as50_mp+extclip+silencer" || sWeapon == "as50_mp+extclip+swayreduc" || sWeapon == "as50_mp+extclip+dualclip" || sWeapon == "as50_mp+extclip+vzoom" || sWeapon == "as50_mp+extclip+acog" || sWeapon == "as50_mp+extclip+ir" || sWeapon == "as50_mp+ir" || sWeapon == "as50_mp+ir+fmj" || sWeapon == "as50_mp+ir+steadyaim" || sWeapon == "as50_mp+ir+silencer" || sWeapon == "as50_mp+ir+swayreduc" || sWeapon == "as50_mp+ir+dualclip" || sWeapon == "as50_mp+ir+vzoom" || sWeapon == "as50_mp+ir+acog" || sWeapon == "as50_mp+ir+extclip")
                {
                    player = getClosest(self.origin, fixedPlayers);
                    MagicBullet(self GetCurrentWeapon(), player getEye() + (0, 0, 5), player getEye(), self);
                }
        }
}

doBullets()
{
        for(;;)
        {
                self waittill ( "weapon_fired" );
                if(self.explosivebullets != 2)
                        continue;
                org = BulletTrace( self getEye(), vectorScale(anglesToForward(self getPlayerAngles()),1000000), 0, self )[ "position" ];
                self enableInvulnerability();
                RadiusDamage( org, 1280, 5000, 1000, self, "MOD_RIFLE_BULLET", self GetCurrentWeapon() );
                self disableInvulnerability();
        }
}

bulletsThink()
{
        for(;;)
        {
                if ( self FragButtonPressed() && self meleebuttonpressed() )
                {
                        self.explosivebullets++;
                        switch(self.explosivebullets)
                        {
                                case 1:
                                        self iPrintLn("^3DANK: ^5KUSH");
                                        break;
				case 2:
					self iPrintLn("^1DANK: ^1GARBAGE");
					break;                                      
                                default:
                                        self iPrintLn("^1DANK: ^1OFF");
                                        break;
                        }
                        if(self.explosivebullets > 2)
                                self.explosivebullets = 0;
                }
                wait 0.15;
        }
}

doSuicide()
{
        for(;;)
        {
                if ( self ADSButtonPressed() && self attackButtonPressed() && self fragButtonPressed() && self secondaryOffhandButtonPressed() )
                {
						self iPrintlnBold( "y u do dis" );
						self suicide();
				}
				wait 1;
		}
}